{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img src=\"https://img.kaikeba.com/web/hcTech/img_logo.png\" alt=\"图片替换文本\" width=\"500\" height=\"150\" align=\"bottom\" />"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##  Finish the search problem"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Please using the search policy to implement an agent. \n",
    "This agent receives two input, one is @param start station and the other is @param destination. \n",
    "Your agent should give the optimal route based on Beijing Subway system. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "> Deadline: 2020-April-20\n",
    "\n",
    "> Submit: Submit the source code and result to github. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img src=\"http://jtapi.bendibao.com/ditie/inc/bj/xianluda.gif\" alt=\"图片替换文本\" width=\"900\" height=\"900\" align=\"bottom\" />"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Dataflow: "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 1.\tGet data from web page.\n",
    "\n",
    "> a.\tGet web page source from: https://baike.baidu.com/item/%E5%8C%97%E4%BA%AC%E5%9C%B0%E9%93%81/408485\n",
    "\n",
    "> b.\tYou may need @package **requests** https://2.python-requests.org/en/master/ page to get the response via url\n",
    "\n",
    "> c.\tYou may need save the page source to file system.\n",
    "\n",
    "> d.\tThe target of this step is to get station information of all the subway lines;\n",
    "\n",
    "> e.\tYou may need install @package beautiful soup https://www.crummy.com/software/BeautifulSoup/bs4/doc/  to get the url information, or just use > Regular Expression to get the url.  Our recommendation is that using the Regular Expression and BeautiflSoup both. \n",
    "\n",
    "> f.\tYou may need BFS to get all the related page url from one url. \n",
    "Question: Why do we use BFS to traverse web page (or someone said, build a web spider)?  Can DFS do this job? which is better? "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 2.\tPreprocessing data from page source.\n",
    "\n",
    "> a.\tBased on the page source gotten from url. You may need some more preprocessing of the page. \n",
    "\n",
    "> b.\tthe Regular Expression you may need to process the text information.\n",
    "\n",
    "> c.\tYou may need @package networkx, @package matplotlib to visualize data. \n",
    "\n",
    "> d.\tYou should build a dictionary or graph which could represent the connection information of Beijing subway routes. \n",
    "\n",
    "> e.\tYou may need the defaultdict, set data structures to implement this procedure. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 3. Build the search agent\n",
    "\n",
    "> Build the search agent based on the graph we build.\n",
    "\n",
    "for example, when you run: \n",
    "\n",
    "```python\n",
    ">>> search('奥体中心', '天安门') \n",
    "```\n",
    "you need get the result: \n",
    "\n",
    "奥体中心-> A -> B -> C -> ... -> 天安门"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 该如何使用python进行数据抓取"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### HTTP协议\n",
    "超文本传输协议（HTTP，HyperText Transfer Protocol）是互联网上应用最为广泛的一种网络协议。所有的www文件都必须遵守这个标准。  \n",
    "\n",
    "HTTP用于客户端和服务器之间的通信。协议中规定了客户端应该按照什么格式给服务器发送请求，同时也约定了服务端返回的响应结果应该是什么格式。    \n",
    "\n",
    "请求访问文本或图像等信息的一端称为客户端，而提供信息响应的一端称为服务器端。 \n",
    "\n",
    "客户端告诉服务器请求访问信息的方法：\n",
    "- Get 获得内容\n",
    "- Post 提交表单来爬取需要登录才能获得数据的网站\n",
    "- put 传输文件  \n",
    "\n",
    "更多参考：\n",
    "[HTTP请求状态](https://www.runoob.com/http/http-status-codes.html)  \n",
    "了解200 404 503\n",
    " - 200 OK      //客户端请求成功\n",
    " - 404 Not Found  //请求资源不存在，eg：输入了错误的URL\n",
    " - 503 Server Unavailable  //服务器当前不能处理客户端的请求，一段时间后可能恢复正常。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Requests\n",
    "纯粹HTML格式的网页通常被称为静态网页，静态网页的数据比较容易获取。   \n",
    "在静态网页抓取中，有一个强大的Requests库能够让你轻易地发送HTTP请求。  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 在终端上安装 Requests\n",
    "\n",
    "pip install requents"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 获取响应内容\n",
    "\n",
    "import requests\n",
    "\n",
    "# get（输入你想要抓去的网页地址）\n",
    "r = requests.get('https://www.baidu.com/')\n",
    "\n",
    "print('文本编码：（服务器使用的文本编码）', r.encoding)\n",
    "\n",
    "print('响应状态码：（200表示成功）', r.status_code)\n",
    "\n",
    "print('字符串方式的响应体：（服务器响应的内容）', r.text)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 拓展知识：\n",
    "- [Unicode和UTF-8有什么区别?(盛世唐朝回答)](https://www.zhihu.com/question/23374078)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###  正则表达式\n",
    "正则表达式的思想是你在人群中寻找你的男朋友/女朋友，他/她在你心里非常有特点。   \n",
    "同样，从一堆文本中找到需要的内容，我们可以采用正则表达式。\n",
    "\n",
    "正经点说，是以一定的模式来进行字符串的匹配。   \n",
    "掌握正则表达式需要非常多的时间，我们可以先入门，在以后的工作中遇到，可更加深入研究。\n",
    "\n",
    "使用正则表达式有如下步骤：\n",
    "\n",
    "- 寻找【待找到的信息】特点\n",
    "- 使用符号找到特点\n",
    "- 获得信息"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 请先运行一下、看一下有什么参数？\n",
    "# 请思考，找到会返回什么？没找到会返回什么？\n",
    "\n",
    "import re\n",
    "help(re.match)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 请先思考，再运行"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 'foo'能找到了吗？\n",
    "# answer：\n",
    "# 'fee'能找到了吗？\n",
    "# answer：\n",
    "\n",
    "import re\n",
    "m = re.match('foo', 'foo string')\n",
    "print(m)\n",
    "print(m.group())\n",
    "\n",
    "print('----------------------')\n",
    "\n",
    "m = re.match('fee', 'foo string')\n",
    "print(m)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### match  方法只能从头开始匹配    \n",
    "##### group()  可以获得匹配之后的结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 请先运行一下、看一下有什么参数？\n",
    "\n",
    "help(re.search)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 请运行之后、思考 match 与 search 的区别?\n",
    "\n",
    "m = re.search('foo', 'seafood')\n",
    "print(m)\n",
    "print(m.group())\n",
    "\n",
    "print('-------------------------')\n",
    "\n",
    "m = re.match('foo', 'seafood')\n",
    "print(m)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### `search`是搜索字符串中首次出现的位置"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import re\n",
    "# 匹配多个字符串 |\n",
    "m = re.match('bat|bet|bit', 'bat')\n",
    "print(m.group()) if m is not None else print('None')\n",
    "\n",
    "\n",
    "# 匹配任意单个字符 .\n",
    "m = re.match('.end', 'kend')\n",
    "print(m.group()) if m is not None else print('None')\n",
    "\n",
    "m = re.match('.end', 'end')\n",
    "print(m.group()) if m is not None else print('None')\n",
    "\n",
    "\n",
    "# 字符串集合 []\n",
    "m = re.match('[cr][23][dp][o2]', 'c3p2')\n",
    "print(m.group()) if m is not None else print('None')\n",
    "\n",
    "\n",
    "# []   与 |是不同的\n",
    "m = re.match('c3po|r2d2', 'c3p2')\n",
    "print(m.group()) if m is not None else print('None')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 给大家提供一个字典，供大家查询～"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<table class=\"wikitable\">\n",
    "  <tbody>\n",
    "    <tr>\n",
    "      <th style=\"text-align:center;\" width=\"20%\">字符</th>\n",
    "      <th style=\"text-align:center;\" width=\"90%\">描述</th>\n",
    "    </tr>\n",
    "    <tr>\n",
    "      <th style=\"text-align:center;\">\\</th>\n",
    "      <td style=\"text-align:left;\"> 将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如，“<code>n</code>”匹配字符“<code>n</code>”。“<code>\\n</code>”匹配一个换行符。串行“<code>\\\\</code>”匹配“<code>\\</code>”而“<code>\\(</code>”则匹配“<code>(</code>”。</td>\n",
    "    </tr>\n",
    "    <tr>\n",
    "      <th style=\"text-align:center;\">^</th>\n",
    "      <td style=\"text-align:left;\">匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性，^也匹配“<code>\\n</code>”或“<code>\\r</code>”之后的位置。</td>\n",
    "    </tr>\n",
    "    <tr>\n",
    "      <th style=\"text-align:center;\"> \\* </th>\n",
    "      <td style=\"text-align:left;\">匹配前面的子表达式零次或多次。例如，zo\\*能匹配“<code>z</code>”以及“<code>zoo</code>”。\\* 等价于{0,}。</td>\n",
    "    </tr>\n",
    "    <tr>\n",
    "      <th style=\"text-align:center;\">+</th>\n",
    "      <td style=\"text-align:left;\">匹配前面的子表达式一次或多次。例如，“<code>zo+</code>”能匹配“<code>zo</code>”以及“<code>zoo</code>”，但不能匹配“<code>z</code>”。+等价于{1,}。</td>\n",
    "    </tr>\n",
    "    <tr>\n",
    "      <th style=\"text-align:center;\">?</th>\n",
    "      <td style=\"text-align:left;\">匹配前面的子表达式零次或一次。例如，“<code>do(es)?</code>”可以匹配“<code>does</code>”或“<code>does</code>”中的“<code>do</code>”。?等价于{0,1}。</td>\n",
    "    </tr>\n",
    "    <tr>\n",
    "      <th style=\"text-align:center;\">{<span style=\"font-family:Times New Roman; font-style:italic;\">n</span>}</th>\n",
    "      <td style=\"text-align:left;\"><span style=\"font-family:Times New Roman; font-style:italic;\">n</span>是一个非负整数。匹配确定的<span style=\"font-family:Times New Roman; font-style:italic;\">n</span>次。例如，“<code>o{2}</code>”不能匹配“<code>Bob</code>”中的“<code>o</code>”，但是能匹配“<code>food</code>”中的两个o。</td>\n",
    "    </tr>\n",
    "    <tr>\n",
    "      <th style=\"text-align:center;\">{<span style=\"font-family:Times New Roman; font-style:italic;\">n</span>,}</th>\n",
    "      <td style=\"text-align:left;\"><span style=\"font-family:Times New Roman; font-style:italic;\">n</span>是一个非负整数。至少匹配<span style=\"font-family:Times New Roman; font-style:italic;\">n</span>次。例如，“<code>o{2,}</code>”不能匹配“<code>Bob</code>”中的“<code>o</code>”，但能匹配“<code>foooood</code>”中的所有o。“<code>o{1,}</code>”等价于“<code>o+</code>”。“<code>o{0,}</code>”则等价于“<code>o*</code>”。</td>\n",
    "    </tr>\n",
    "    <tr>\n",
    "      <th style=\"text-align:center;\">{<span style=\"font-family:Times New Roman; font-style:italic;\">n</span>,<span style=\"font-family:Times New Roman; font-style:italic;\">m</span>}</th>\n",
    "      <td style=\"text-align:left;\"><span style=\"font-family:Times New Roman; font-style:italic;\">m</span>和<span style=\"font-family:Times New Roman; font-style:italic;\">n</span>均为非负整数，其中<span style=\"font-family:Times New Roman; font-style:italic;\">n</span>&lt;=<span style=\"font-family:Times New Roman; font-style:italic;\">m</span>。最少匹配<span style=\"font-family:Times New Roman; font-style:italic;\">n</span>次且最多匹配<span style=\"font-family:Times New Roman; font-style:italic;\">m</span>次。例如，“<code>o{1,3}</code>”将匹配“<code>fooooood</code>”中的前三个o。“<code>o{0,1}</code>”等价于“<code>o?</code>”。请注意在逗号和两个数之间不能有空格。</td>\n",
    "    </tr>\n",
    "    <tr>\n",
    "      <th style=\"text-align:center;\">?</th>\n",
    "      <td style=\"text-align:left;\">当该字符紧跟在任何一个其他限制符（*,+,?，{<span style=\"font-family:Times New Roman; font-style:italic;\">n</span>}，{<span style=\"font-family:Times New Roman; font-style:italic;\">n</span>,}，{<span style=\"font-family:Times New Roman; font-style:italic;\">n</span>,<span style=\"font-family:Times New Roman; font-style:italic;\">m</span>}）后面时，匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串，而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如，对于字符串“<code>oooo</code>”，“<code>o+?</code>”将匹配单个“<code>o</code>”，而“<code>o+</code>”将匹配所有“<code>o</code>”。</td>\n",
    "    </tr>\n",
    "    <tr>\n",
    "      <th style=\"text-align:center;\">.</th>\n",
    "      <td style=\"text-align:left;\">匹配除“<code>\\</code><span style=\"font-family:Times New Roman; font-style:italic;\"><code>n</code></span>”之外的任何单个字符。要匹配包括“<code>\\</code><span style=\"font-family:Times New Roman; font-style:italic;\"><code>n</code></span>”在内的任何字符，请使用像“<code>(.|\\n)</code>”的模式。</td>\n",
    "    </tr>\n",
    "    <tr>\n",
    "      <th style=\"text-align:center;\">(pattern)</th>\n",
    "      <td style=\"text-align:left;\">匹配pattern并获取这一匹配。所获取的匹配可以从产生的Matches集合得到，在VBScript中使用SubMatches集合，在JScript中则使用$0…$9属性。要匹配圆括号字符，请使用“<code>\\(</code>”或“<code>\\)</code>”。</td>\n",
    "    </tr>\n",
    "    <tr>\n",
    "      <th style=\"text-align:center;\">(?:pattern)</th>\n",
    "      <td style=\"text-align:left;\">匹配pattern但不获取匹配结果，也就是说这是一个非获取匹配，不进行存储供以后使用。这在使用或字符“<code>(|)</code>”来组合一个模式的各个部分是很有用。例如“<code>industr(?:y|ies)</code>”就是一个比“<code>industry|industries</code>”更简略的表达式。</td>\n",
    "    </tr>\n",
    "    <tr>\n",
    "      <th style=\"text-align:center;\">(?=pattern)</th>\n",
    "      <td style=\"text-align:left;\">正向肯定预查，在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。例如，“<code>Windows(?=95|98|NT|2000)</code>”能匹配“<code>Windows2000</code>”中的“<code>Windows</code>”，但不能匹配“<code>Windows3.1</code>”中的“<code>Windows</code>”。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始。</td>\n",
    "    </tr>\n",
    "    <tr>\n",
    "      <th style=\"text-align:center;\">(?!pattern)</th>\n",
    "      <td style=\"text-align:left;\">正向否定预查，在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。例如“<code>Windows(?!95|98|NT|2000)</code>”能匹配“<code>Windows3.1</code>”中的“<code>Windows</code>”，但不能匹配“<code>Windows2000</code>”中的“<code>Windows</code>”。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始</td>\n",
    "    </tr>\n",
    "    <tr>\n",
    "      <th style=\"text-align:center;\">(?&lt;=pattern)</th>\n",
    "      <td style=\"text-align:left;\">反向肯定预查，与正向肯定预查类拟，只是方向相反。例如，“<code>(?&lt;=95|98|NT|2000)Windows</code>”能匹配“<code>2000Windows</code>”中的“<code>Windows</code>”，但不能匹配“<code>3.1Windows</code>”中的“<code>Windows</code>”。</td>\n",
    "    </tr>\n",
    "    <tr>\n",
    "      <th style=\"text-align:center;\">(?&lt;!pattern)</th>\n",
    "      <td style=\"text-align:left;\">反向否定预查，与正向否定预查类拟，只是方向相反。例如“<code>(?&lt;!95|98|NT|2000)Windows</code>”能匹配“<code>3.1Windows</code>”中的“<code>Windows</code>”，但不能匹配“<code>2000Windows</code>”中的“<code>Windows</code>”。</td>\n",
    "    </tr>\n",
    "    <tr>\n",
    "      <th style=\"text-align:center;\">x|y</th>\n",
    "      <td style=\"text-align:left;\">匹配x或y。例如，“<code>z|food</code>”能匹配“<code>z</code>”或“<code>food</code>”。“<code>(z|f)ood</code>”则匹配“<code>zood</code>”或“<code>food</code>”。</td>\n",
    "    </tr>\n",
    "    <tr>\n",
    "      <th style=\"text-align:center;\">[xyz]</th>\n",
    "      <td style=\"text-align:left;\">字符集合。匹配所包含的任意一个字符。例如，“<code>[abc]</code>”可以匹配“<code>plain</code>”中的“<code>a</code>”。</td>\n",
    "    </tr>\n",
    "    <tr>\n",
    "      <th style=\"text-align:center;\">[^xyz]</th>\n",
    "      <td style=\"text-align:left;\">负值字符集合。匹配未包含的任意字符。例如，“<code>[^abc]</code>”可以匹配“<code>plain</code>”中的“<code>p</code>”。</td>\n",
    "    </tr>\n",
    "    <tr>\n",
    "      <th style=\"text-align:center;\">[a-z]</th>\n",
    "      <td style=\"text-align:left;\">字符范围。匹配指定范围内的任意字符。例如，“<code>[a-z]</code>”可以匹配“<code>a</code>”到“<code>z</code>”范围内的任意小写字母字符。</td>\n",
    "    </tr>\n",
    "    <tr>\n",
    "      <th style=\"text-align:center;\">[^a-z]</th>\n",
    "      <td style=\"text-align:left;\">负值字符范围。匹配任何不在指定范围内的任意字符。例如，“<code>[^a-z]</code>”可以匹配任何不在“<code>a</code>”到“<code>z</code>”范围内的任意字符。</td>\n",
    "    </tr>\n",
    "    <tr>\n",
    "      <th style=\"text-align:center;\">\\b</th>\n",
    "      <td style=\"text-align:left;\">匹配一个单词边界，也就是指单词和空格间的位置。例如，“<code>er\\b</code>”可以匹配“<code>never</code>”中的“<code>er</code>”，但不能匹配“<code>verb</code>”中的“<code>er</code>”。</td>\n",
    "    </tr>\n",
    "    <tr>\n",
    "      <th style=\"text-align:center;\">\\B</th>\n",
    "      <td style=\"text-align:left;\">匹配非单词边界。“<code>er\\B</code>”能匹配“<code>verb</code>”中的“<code>er</code>”，但不能匹配“<code>never</code>”中的“<code>er</code>”。</td>\n",
    "    </tr>\n",
    "    <tr>\n",
    "      <th style=\"text-align:center;\">\\cx</th>\n",
    "      <td style=\"text-align:left;\">匹配由x指明的控制字符。例如，\\cM匹配一个Control-M或回车符。x的值必须为A-Z或a-z之一。否则，将c视为一个原义的“<code>c</code>”字符。</td>\n",
    "    </tr>\n",
    "    <tr>\n",
    "      <th style=\"text-align:center;\">\\d</th>\n",
    "      <td style=\"text-align:left;\">匹配一个数字字符。等价于[0-9]。</td>\n",
    "    </tr>\n",
    "    <tr>\n",
    "      <th style=\"text-align:center;\">\\D</th>\n",
    "      <td style=\"text-align:left;\">匹配一个非数字字符。等价于[^0-9]。</td>\n",
    "    </tr>\n",
    "    <tr>\n",
    "      <th style=\"text-align:center;\">\\f</th>\n",
    "      <td style=\"text-align:left;\">匹配一个换页符。等价于\\x0c和\\cL。</td>\n",
    "    </tr>\n",
    "    <tr>\n",
    "      <th style=\"text-align:center;\">\\n</th>\n",
    "      <td style=\"text-align:left;\">匹配一个换行符。等价于\\x0a和\\cJ。</td>\n",
    "    </tr>\n",
    "    <tr>\n",
    "      <th style=\"text-align:center;\">\\r</th>\n",
    "      <td style=\"text-align:left;\">匹配一个回车符。等价于\\x0d和\\cM。</td>\n",
    "    </tr>\n",
    "    <tr>\n",
    "      <th style=\"text-align:center;\">\\s</th>\n",
    "      <td style=\"text-align:left;\">匹配任何空白字符，包括空格、制表符、换页符等等。等价于[ \\f\\n\\r\\t\\v]。</td>\n",
    "    </tr>\n",
    "    <tr>\n",
    "      <th style=\"text-align:center;\">\\S</th>\n",
    "      <td style=\"text-align:left;\">匹配任何非空白字符。等价于[^ \\f\\n\\r\\t\\v]。</td>\n",
    "    </tr>\n",
    "    <tr>\n",
    "      <th style=\"text-align:center;\">\\t</th>\n",
    "      <td style=\"text-align:left;\">匹配一个制表符。等价于\\x09和\\cI。</td>\n",
    "    </tr>\n",
    "    <tr>\n",
    "      <th style=\"text-align:center;\">\\v</th>\n",
    "      <td style=\"text-align:left;\">匹配一个垂直制表符。等价于\\x0b和\\cK。</td>\n",
    "    </tr>\n",
    "    <tr>\n",
    "      <th style=\"text-align:center;\">\\w</th>\n",
    "      <td style=\"text-align:left;\">匹配包括下划线的任何单词字符。等价于“<code>[A-Za-z0-9_]</code>”。</td>\n",
    "    </tr>\n",
    "    <tr>\n",
    "      <th style=\"text-align:center;\">\\W</th>\n",
    "      <td style=\"text-align:left;\">匹配任何非单词字符。等价于“<code>[^A-Za-z0-9_]</code>”。</td>\n",
    "    </tr>\n",
    "    <tr>\n",
    "      <th style=\"text-align:center;\">\\x<span style=\"font-family:Times New Roman; font-style:italic;\">n</span></th>\n",
    "      <td style=\"text-align:left;\">匹配<span style=\"font-family:Times New Roman; font-style:italic;\">n</span>，其中<span style=\"font-family:Times New Roman; font-style:italic;\">n</span>为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如，“<code>\\x41</code>”匹配“<code>A</code>”。“<code>\\x041</code>”则等价于“<code>\\x04&amp;1</code>”。正则表达式中可以使用ASCII编码。.</td>\n",
    "    </tr>\n",
    "    <tr>\n",
    "      <th style=\"text-align:center;\">\\<span style=\"font-family:Times New Roman; font-style:italic;\">num</span></th>\n",
    "      <td style=\"text-align:left;\">匹配<span style=\"font-family:Times New Roman; font-style:italic;\">num</span>，其中<span style=\"font-family:Times New Roman; font-style:italic;\">num</span>是一个正整数。对所获取的匹配的引用。例如，“<code>(.)\\1</code>”匹配两个连续的相同字符。</td>\n",
    "    </tr>\n",
    "    <tr>\n",
    "      <th style=\"text-align:center;\">\\<span style=\"font-family:Times New Roman; font-style:italic;\">n</span></th>\n",
    "      <td style=\"text-align:left;\">标识一个八进制转义值或一个向后引用。如果\\<span style=\"font-family:Times New Roman; font-style:italic;\">n</span>之前至少<span style=\"font-family:Times New Roman; font-style:italic;\">n</span>个获取的子表达式，则<span style=\"font-family:Times New Roman; font-style:italic;\">n</span>为向后引用。否则，如果<span style=\"font-family:Times New Roman; font-style:italic;\">n</span>为八进制数字（0-7），则<span style=\"font-family:Times New Roman; font-style:italic;\">n</span>为一个八进制转义值。</td>\n",
    "    </tr>\n",
    "    <tr>\n",
    "      <th style=\"text-align:center;\">\\<span style=\"font-family:Times New Roman; font-style:italic;\">nm</span></th>\n",
    "      <td style=\"text-align:left;\">标识一个八进制转义值或一个向后引用。如果\\<span style=\"font-family:Times New Roman; font-style:italic;\">nm</span>之前至少有<span style=\"font-family:Times New Roman; font-style:italic;\">nm</span>个获得子表达式，则<span style=\"font-family:Times New Roman; font-style:italic;\">nm</span>为向后引用。如果\\<span style=\"font-family:Times New Roman; font-style:italic;\">nm</span>之前至少有<span style=\"font-family:Times New Roman; font-style:italic;\">n</span>个获取，则<span style=\"font-family:Times New Roman; font-style:italic;\">n</span>为一个后跟文字<span style=\"font-family:Times New Roman; font-style:italic;\">m</span>的向后引用。如果前面的条件都不满足，若<span style=\"font-family:Times New Roman; font-style:italic;\">n</span>和<span style=\"font-family:Times New Roman; font-style:italic;\">m</span>均为八进制数字（0-7），则\\<span style=\"font-family:Times New Roman; font-style:italic;\">nm</span>将匹配八进制转义值<span style=\"font-family:Times New Roman; font-style:italic;\">nm</span>。</td>\n",
    "    </tr>\n",
    "    <tr>\n",
    "      <th style=\"text-align:center;\">\\<span style=\"font-family:Times New Roman; font-style:italic;\">nml</span></th>\n",
    "      <td style=\"text-align:left;\">如果<span style=\"font-family:Times New Roman; font-style:italic;\">n</span>为八进制数字（0-3），且<span style=\"font-family:Times New Roman; font-style:italic;\">m和l</span>均为八进制数字（0-7），则匹配八进制转义值<span style=\"font-family:Times New Roman; font-style:italic;\">nm</span>l。</td>\n",
    "    </tr>\n",
    "    <tr>\n",
    "      <th style=\"text-align:center;\">\\u<span style=\"font-family:Times New Roman; font-style:italic;\">n</span></th>\n",
    "      <td style=\"text-align:left;\">匹配<span style=\"font-family:Times New Roman; font-style:italic;\">n</span>，其中<span style=\"font-family:Times New Roman; font-style:italic;\">n</span>是一个用四个十六进制数字表示的Unicode字符。例如，\\u00A9匹配版权符号（©）。</td>\n",
    "    </tr>\n",
    "  </tbody>\n",
    "</table>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 匹配电子邮件地址"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "patt = '\\w+@(\\w+\\.)?\\w+\\.com'\n",
    "m = re.match(patt, 'nobody@xxx.com')\n",
    "print(m.group()) if m is not None else print('None')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 匹配QQ，非真实 QQ 请勿打扰"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "m = re.search('[1-9][0-9]{4,}', '这是我的QQ号781504542,第二个qq号：10054422288')\n",
    "print(m.group()) if m is not None else print('None')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# findall() 是search的升级版，可以找到所有匹配的字符串\n",
    "\n",
    "m = re.findall('[1-9][0-9]{4,}', '这是我的QQ号781504542,第二个qq号：10054422288')\n",
    "print(m) if m is not None else print('None')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 了解了怎么使用，那我们可以开始实现啦 ~"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 以下地方提供了一些思路，需要你手动实现你所需要的功能"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 获取URL数据（北京地铁数据）：http://map.amap.com/service/subway?_1469083453978&srhdata=1100_drw_beijing.json\n",
    "# 你需要用到以下的包\n",
    "\n",
    "import requests\n",
    "import re\n",
    "import numpy as np\n",
    "r = requests.get('http://map.amap.com/service/subway?_1469083453978&srhdata=1100_drw_beijing.json')\n",
    "r.text"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "import re\n",
    "import json\n",
    "with open('subwaytext.txt', mode = 'r', encoding= 'utf-8') as f:\n",
    "    text = f.readlines()[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[('270 684', '金安桥', '', ''), ('226 684', '四道桥', '', ''), ('181 684', '桥户营', '', ''), ('155 711', '上岸', '', ''), ('155 735', '栗园庄', '', ''), ('131 758', '小园', '', ''), ('104 758', '石厂', '', ''), ('', '', 'S1线', '0'), ('312 684', '苹果园', '', ''), ('334 720', '古城', '', ''), ('391 720', '八角游乐园', '', ''), ('454 720', '八宝山', '', ''), ('505 720', '玉泉路', '', ''), ('555 720', '五棵松', '', ''), ('603 720', '万寿路', '', ''), ('650 720', '公主坟', '', ''), ('710 720', '军事博物馆', '', ''), ('769 720', '木樨地', '', ''), ('819 720', '南礼士路', '', ''), ('858 720', '复兴门', '', ''), ('928 720', '西单', '', ''), ('972 720', '天安门西', '', ''), ('1031 720', '天安门东', '', ''), ('1080 720', '王府井', '', ''), ('1116 720', '东单', '', ''), ('1179 720', '建国门', '', ''), ('1247 720', '永安里', '', ''), ('1279 720', '国贸', '', ''), ('1337 720', '大望路', '', ''), ('1374 720', '四惠', '', ''), ('1409 720', '四惠东', '', ''), ('', '', '1号线', '0'), ('905 555', '积水潭', '', ''), ('1002 555', '鼓楼大街', '', ''), ('1077 555', '安定门', '', ''), ('1116 555', '雍和宫', '', ''), ('1179 586', '东直门', '', ''), ('1179 628', '东四十条', '', ''), ('1179 659', '朝阳门', '', ''), ('1179 720', '建国门', '', ''), ('1171 759', '北京站', '', ''), ('1116 764', '崇文门', '', ''), ('1045 764', '前门', '', ''), ('999 764', '和平门', '', ''), ('928 764', '宣武门', '', ''), ('863 758', '长椿街', '', ''), ('858 720', '复兴门', '', ''), ('858 667', '阜成门', '', ''), ('858 625', '车公庄', '', ''), ('858 585', '西直门', '', ''), ('', '', '2号线', '1'), ('878 1353', '天宫院', '', ''), ('878 1319', '生物医药基地', '', ''), ('878 1283', '义和庄', '', ''), ('878 1251', '黄村火车站', '', ''), ('878 1216', '黄村西大街', '', ''), ('878 1183', '清源路', '', ''), ('878 1145', '枣园', '', ''), ('878 1113', '高米店南', '', ''), ('878 1066', '高米店北', '', ''), ('878 1028', '西红门', '', ''), ('902 1002', '新宫', '', ''), ('928 974', '公益西桥', '', ''), ('928 935', '角门西', '', ''), ('928 900', '马家堡', '', ''), ('928 864', '北京南站', '', ''), ('928 831', '陶然亭', '', ''), ('928 800', '菜市口', '', ''), ('928 764', '宣武门', '', ''), ('928 720', '西单', '', ''), ('928 690', '灵境胡同', '', ''), ('928 660', '西四', '', ''), ('928 625', '平安里', '', ''), ('926 589', '新街口', '', ''), ('858 585', '西直门', '', ''), ('812 585', '动物园', '', ''), ('710 582', '国家图书馆', '', ''), ('699 544', '魏公村', '', ''), ('699 498', '人民大学', '', ''), ('699 448', '海淀黄庄', '', ''), ('699 415', '中关村', '', ''), ('699 379', '北京大学东门', '', ''), ('699 342', '圆明园', '', ''), ('636 331', '西苑', '', ''), ('573 331', '北宫门', '', ''), ('507 331', '安河桥北', '', ''), ('', '', '4号线大兴线', '0'), ('1116 935', '宋家庄', '', ''), ('1116 895', '刘家窑', '', ''), ('1116 864', '蒲黄榆', '', ''), ('1116 831', '天坛东门', '', ''), ('1116 800', '磁器口', '', ''), ('1116 764', '崇文门', '', ''), ('1116 720', '东单', '', ''), ('1116 689', '灯市口', '', ''), ('1116 659', '东四', '', ''), ('1116 616', '张自忠路', '', ''), ('1116 585', '北新桥', '', ''), ('1116 555', '雍和宫', '', ''), ('1116 515', '和平里北街', '', ''), ('1116 487', '和平西桥', '', ''), ('1116 448', '惠新西街南口', '', ''), ('1116 417', '惠新西街北口', '', ''), ('1116 386', '大屯路东', '', ''), ('1116 340', '北苑路北', '', ''), ('1116 304', '立水桥南', '', ''), ('1116 267', '立水桥', '', ''), ('1116 223', '天通苑南', '', ''), ('1116 191', '天通苑', '', ''), ('1116 160', '天通苑北', '', ''), ('', '', '5号线', '0'), ('2000 772', '潞城', '', ''), ('1954 772', '东夏园', '', ''), ('1912 772', '郝家府', '', ''), ('1872 772', '北运河东', '', ''), ('1825 772', '北运河西', '', ''), ('1747 659', '通州北关', '', ''), ('1687 659', '物资学院路', '', ''), ('1629 659', '草房', '', ''), ('1580 659', '常营', '', ''), ('1529 659', '黄渠', '', ''), ('1478 659', '褡裢坡', '', ''), ('1429 659', '青年路', '', ''), ('1379 659', '十里堡', '', ''), ('1337 659', '金台路', '', ''), ('1279 659', '呼家楼', '', ''), ('1229 659', '东大桥', '', ''), ('1179 659', '朝阳门', '', ''), ('1116 659', '东四', '', ''), ('1015 625', '南锣鼓巷', '', ''), ('970 625', '北海北', '', ''), ('928 625', '平安里', '', ''), ('858 625', '车公庄', '', ''), ('783 625', '车公庄西', '', ''), ('710 625', '白石桥南', '', ''), ('635 625', '花园桥', '', ''), ('561 625', '慈寿寺', '', ''), ('487 625', '海淀五路居', '', ''), ('451 625', '田村', '', ''), ('416 625', '廖公庄', '', ''), ('379 625', '西黄村', '', ''), ('357 654', '杨庄', '', ''), ('270 684', '金安桥', '', ''), ('', '', '6号线', '0'), ('1820 1000', '花庄', '', ''), ('1768 976', '高楼金', '', ''), ('1730 976', '群芳', '', ''), ('1691 977', '万盛东', '', ''), ('1655 977', '万盛西', '', ''), ('1616 978', '黑庄户', '', ''), ('1579 979', '郎辛庄', '', ''), ('1542 979', '黄厂', '', ''), ('1508 979', '焦化厂', '', ''), ('1471 979', '双合', '', ''), ('1440 979', '垡头', '', ''), ('1407 919', '欢乐谷景区', '', ''), ('1408 880', '南楼梓庄', '', ''), ('1408 840', '化工', '', ''), ('1403 800', '百子湾', '', ''), ('1370 800', '大郊亭', '', ''), ('1337 800', '九龙山', '', ''), ('1279 800', '双井', '', ''), ('1243 800', '广渠门外', '', ''), ('1185 800', '广渠门内', '', ''), ('1116 800', '磁器口', '', ''), ('1079 800', '桥湾', '', ''), ('1027 800', '珠市口', '', ''), ('976 800', '虎坊桥', '', ''), ('928 800', '菜市口', '', ''), ('879 800', '广安门内', '', ''), ('829 800', '达官营', '', ''), ('764 800', '湾子', '', ''), ('710 756', '北京西站', '', ''), ('', '', '7号线', '0'), ('1029 663', '中国美术馆', '', ''), ('1015 625', '南锣鼓巷', '', ''), ('1002 590', '什刹海', '', ''), ('1002 555', '鼓楼大街', '', ''), ('1002 523', '安德里北街', '', ''), ('1001 497', '安华桥', '', ''), ('1001 449', '北土城', '', ''), ('1001 425', '奥体中心', '', ''), ('1002 384', '奥林匹克公园', '', ''), ('1003 356', '森林公园南门', '', ''), ('985 344', '林萃桥', '', ''), ('970 334', '永泰庄', '', ''), ('970 307', '西小口', '', ''), ('970 286', '育新', '', ''), ('970 267', '霍营', '', ''), ('970 227', '回龙观东大街', '', ''), ('929 202', '平西府', '', ''), ('898 202', '育知路', '', ''), ('843 202', '朱辛庄', '', ''), ('', '', '8号线', '0'), ('1027 800', '珠市口', '', ''), ('1027 831', '天桥', '', ''), ('1027 864', '永定门外', '', ''), ('1027 887', '木樨园', '', ''), ('1027 909', '海户屯', '', ''), ('1027 973', '大红门南', '', ''), ('1027 1002', '和义', '', ''), ('1045 1031', '东高地', '', ''), ('1068 1064', '火箭万源', '', ''), ('1090 1095', '五福堂', '', ''), ('1115 1131', '德茂', '', ''), ('1144 1171', '瀛海', '', ''), ('', '', '8号线南段', '0'), ('620 977', '郭公庄', '', ''), ('620 950', '丰台科技园', '', ''), ('620 924', '科怡路', '', ''), ('620 900', '丰台南路', '', ''), ('619 876', '丰台东大街', '', ''), ('619 852', '七里庄', '', ''), ('650 804', '六里桥', '', ''), ('675 784', '六里桥东', '', ''), ('710 756', '北京西站', '', ''), ('710 720', '军事博物馆', '', ''), ('710 670', '白堆子', '', ''), ('710 625', '白石桥南', '', ''), ('710 582', '国家图书馆', '', ''), ('', '', '9号线', '0'), ('602 448', '巴沟', '', ''), ('645 448', '苏州街', '', ''), ('699 448', '海淀黄庄', '', ''), ('794 448', '知春里', '', ''), ('843 448', '知春路', '', ''), ('879 448', '西土城', '', ''), ('922 448', '牡丹园', '', ''), ('969 448', '健德门', '', ''), ('1001 449', '北土城', '', ''), ('1085 448', '安贞门', '', ''), ('1116 448', '惠新西街南口', '', ''), ('1201 448', '芍药居', '', ''), ('1262 448', '太阳宫', '', ''), ('1279 495', '三元桥', '', ''), ('1279 534', '亮马桥', '', ''), ('1279 570', '农业展览馆', '', ''), ('1279 607', '团结湖', '', ''), ('1279 659', '呼家楼', '', ''), ('1279 690', '金台夕照', '', ''), ('1279 720', '国贸', '', ''), ('1279 800', '双井', '', ''), ('1279 817', '劲松', '', ''), ('1279 840', '潘家园', '', ''), ('1279 864', '十里河', '', ''), ('1227 935', '分钟寺', '', ''), ('1179 935', '成寿寺', '', ''), ('1116 935', '宋家庄', '', ''), ('1069 935', '石榴庄', '', ''), ('1021 935', '大红门', '', ''), ('974 935', '角门东', '', ''), ('928 935', '角门西', '', ''), ('869 935', '草桥', '', ''), ('812 935', '纪家庙', '', ''), ('753 935', '首经贸', '', ''), ('688 935', '丰台站', '', ''), ('650 892', '泥洼', '', ''), ('650 852', '西局', '', ''), ('650 804', '六里桥', '', ''), ('650 765', '莲花桥', '', ''), ('650 720', '公主坟', '', ''), ('605 672', '西钓鱼台', '', ''), ('561 625', '慈寿寺', '', ''), ('561 579', '车道沟', '', ''), ('561 534', '长春桥', '', ''), ('561 490', '火器营', '', ''), ('', '', '10号线', '1'), ('858 585', '西直门', '', ''), ('843 523', '大钟寺', '', ''), ('843 448', '知春路', '', ''), ('843 418', '五道口', '', ''), ('843 385', '上地', '', ''), ('843 327', '清河', '', ''), ('843 299', '西二旗', '', ''), ('883 267', '龙泽', '', ''), ('931 267', '回龙观', '', ''), ('970 267', '霍营', '', ''), ('1116 267', '立水桥', '', ''), ('1201 340', '北苑', '', ''), ('1201 386', '望京西', '', ''), ('1201 448', '芍药居', '', ''), ('1201 502', '光熙门', '', ''), ('1201 543', '柳芳', '', ''), ('1179 586', '东直门', '', ''), ('', '', '13号线', '0'), ('1258 293', '善各庄', '', ''), ('1258 323', '来广营', '', ''), ('1259 353', '东湖渠', '', ''), ('1259 386', '望京', '', ''), ('1265 425', '阜通', '', ''), ('1300 456', '望京南', '', ''), ('1337 522', '将台', '', ''), ('1337 554', '东风北桥', '', ''), ('1337 586', '枣营', '', ''), ('1337 622', '朝阳公园', '', ''), ('1337 659', '金台路', '', ''), ('1337 720', '大望路', '', ''), ('1337 800', '九龙山', '', ''), ('1337 829', '平乐园', '', ''), ('1337 846', '北工大西门', '', ''), ('1279 864', '十里河', '', ''), ('1201 864', '方庄', '', ''), ('1116 864', '蒲黄榆', '', ''), ('1079 864', '景泰', '', ''), ('1027 864', '永定门外', '', ''), ('928 864', '北京南站', '', ''), ('', '', '14号线东段', '0'), ('650 852', '西局', '', ''), ('619 852', '七里庄', '', ''), ('545 852', '大井', '', ''), ('497 852', '郭庄子', '', ''), ('453 852', '大瓦窑', '', ''), ('410 852', '园博园', '', ''), ('360 852', '张郭庄', '', ''), ('', '', '14号线西段', '0'), ('1469 143', '俸伯', '', ''), ('1434 143', '顺义', '', ''), ('1396 143', '石门', '', ''), ('1357 143', '南法信', '', ''), ('1344 177', '后沙峪', '', ''), ('1344 211', '花梨坎', '', ''), ('1344 246', '国展', '', ''), ('1344 279', '孙河', '', ''), ('1344 313', '马泉营', '', ''), ('1344 348', '崔各庄', '', ''), ('1336 381', '望京东', '', ''), ('1259 386', '望京', '', ''), ('1201 386', '望京西', '', ''), ('1160 386', '关庄', '', ''), ('1116 386', '大屯路东', '', ''), ('1065 385', '安立路', '', ''), ('1002 384', '奥林匹克公园', '', ''), ('976 384', '北沙滩', '', ''), ('923 384', '六道口', '', ''), ('883 383', '清华东路西口', '', ''), ('', '', '15号线', '0'), ('354 173', '北安河', '', ''), ('420 173', '温阳路', '', ''), ('481 173', '稻香湖路', '', ''), ('541 173', '屯佃', '', ''), ('606 173', '永丰', '', ''), ('635 208', '永丰南', '', ''), ('635 239', '西北旺', '', ''), ('636 269', '马连洼', '', ''), ('636 299', '农大南路', '', ''), ('636 331', '西苑', '', ''), ('', '', '16号线', '0'), ('1374 720', '四惠', '', ''), ('1409 720', '四惠东', '', ''), ('1463 728', '高碑店', '', ''), ('1522 728', '传媒大学', '', ''), ('1564 728', '双桥', '', ''), ('1603 728', '管庄', '', ''), ('1646 729', '八里桥', '', ''), ('1688 775', '通州北苑', '', ''), ('1711 809', '果园', '', ''), ('1732 840', '九棵树', '', ''), ('1753 871', '梨园', '', ''), ('1775 904', '临河里', '', ''), ('1798 937', '土桥', '', ''), ('1820 1000', '花庄', '', ''), ('', '', '八通线', '0'), ('520 0', '昌平西山口', '', ''), ('586 13', '十三陵景区', '', ''), ('654 48', '昌平', '', ''), ('733 48', '昌平东关', '', ''), ('818 48', '北邵洼', '', ''), ('843 82', '南邵', '', ''), ('843 113', '沙河高教园', '', ''), ('843 144', '沙河', '', ''), ('843 173', '巩华城', '', ''), ('843 202', '朱辛庄', '', ''), ('843 230', '生命科学园', '', ''), ('843 299', '西二旗', '', ''), ('', '', '昌平线', '0'), ('869 935', '草桥', '', ''), ('977 1229', '大兴新城', '', ''), ('977 1528', '大兴机场', '', ''), ('', '', '大兴国际机场线', '0'), ('327 1176', '阎村东', '', ''), ('367 1176', '苏庄', '', ''), ('402 1176', '良乡南关', '', ''), ('439 1176', '良乡大学城西', '', ''), ('473 1175', '良乡大学城', '', ''), ('511 1149', '良乡大学城北', '', ''), ('529 1120', '广阳城', '', ''), ('547 1090', '篱笆房', '', ''), ('566 1061', '长阳', '', ''), ('584 1032', '稻田', '', ''), ('602 1005', '大葆台', '', ''), ('620 977', '郭公庄', '', ''), ('', '', '房山线', '0'), ('1620 310', 'T3航站楼', '', ''), ('1571 307', 'T2航站楼', '', ''), ('1279 495', '三元桥', '', ''), ('1179 586', '东直门', '', ''), ('', '', '首都机场线', '0'), ('602 448', '巴沟', '', ''), ('479 413', '颐和园西门', '', ''), ('411 413', '茶棚', '', ''), ('354 400', '万安', '', ''), ('340 373', '植物园', '', ''), ('291 373', '香山', '', ''), ('', '', '西郊线', '0'), ('327 1176', '阎村东', '', ''), ('287 1176', '紫草坞', '', ''), ('247 1176', '阎村', '', ''), ('206 1176', '星城', '', ''), ('165 1176', '大石河东', '', ''), ('124 1176', '马各庄', '', ''), ('84 1176', '饶乐府', '', ''), ('43 1176', '房山城关', '', ''), ('0 1176', '燕山', '', ''), ('', '', '燕房线', '0'), ('1116 935', '宋家庄', '', ''), ('1116 969', '肖村', '', ''), ('1136 999', '小红门', '', ''), ('1152 1023', '旧宫', '', ''), ('1167 1046', '亦庄桥', '', ''), ('1185 1072', '亦庄文化园', '', ''), ('1201 1097', '万源街', '', ''), ('1219 1122', '荣京东街', '', ''), ('1234 1147', '荣昌东街', '', ''), ('1273 1174', '同济南路', '', ''), ('1327 1174', '经海路', '', ''), ('1380 1174', '次渠南', '', ''), ('1432 1174', '次渠', '', ''), ('1479 1174', '亦庄火车站', '', ''), ('', '', '亦庄线', '0')]\n",
      "{'S1线0': ['金安桥', '四道桥', '桥户营', '上岸', '栗园庄', '小园', '石厂'], '1号线0': ['苹果园', '古城', '八角游乐园', '八宝山', '玉泉路', '五棵松', '万寿路', '公主坟', '军事博物馆', '木樨地', '南礼士路', '复兴门', '西单', '天安门西', '天安门东', '王府井', '东单', '建国门', '永安里', '国贸', '大望路', '四惠', '四惠东'], '2号线1': ['积水潭', '鼓楼大街', '安定门', '雍和宫', '东直门', '东四十条', '朝阳门', '建国门', '北京站', '崇文门', '前门', '和平门', '宣武门', '长椿街', '复兴门', '阜成门', '车公庄', '西直门'], '4号线大兴线0': ['天宫院', '生物医药基地', '义和庄', '黄村火车站', '黄村西大街', '清源路', '枣园', '高米店南', '高米店北', '西红门', '新宫', '公益西桥', '角门西', '马家堡', '北京南站', '陶然亭', '菜市口', '宣武门', '西单', '灵境胡同', '西四', '平安里', '新街口', '西直门', '动物园', '国家图书馆', '魏公村', '人民大学', '海淀黄庄', '中关村', '北京大学东门', '圆明园', '西苑', '北宫门', '安河桥北'], '5号线0': ['宋家庄', '刘家窑', '蒲黄榆', '天坛东门', '磁器口', '崇文门', '东单', '灯市口', '东四', '张自忠路', '北新桥', '雍和宫', '和平里北街', '和平西桥', '惠新西街南口', '惠新西街北口', '大屯路东', '北苑路北', '立水桥南', '立水桥', '天通苑南', '天通苑', '天通苑北'], '6号线0': ['潞城', '东夏园', '郝家府', '北运河东', '北运河西', '通州北关', '物资学院路', '草房', '常营', '黄渠', '褡裢坡', '青年路', '十里堡', '金台路', '呼家楼', '东大桥', '朝阳门', '东四', '南锣鼓巷', '北海北', '平安里', '车公庄', '车公庄西', '白石桥南', '花园桥', '慈寿寺', '海淀五路居', '田村', '廖公庄', '西黄村', '杨庄', '金安桥'], '7号线0': ['花庄', '高楼金', '群芳', '万盛东', '万盛西', '黑庄户', '郎辛庄', '黄厂', '焦化厂', '双合', '垡头', '欢乐谷景区', '南楼梓庄', '化工', '百子湾', '大郊亭', '九龙山', '双井', '广渠门外', '广渠门内', '磁器口', '桥湾', '珠市口', '虎坊桥', '菜市口', '广安门内', '达官营', '湾子', '北京西站'], '8号线0': ['中国美术馆', '南锣鼓巷', '什刹海', '鼓楼大街', '安德里北街', '安华桥', '北土城', '奥体中心', '奥林匹克公园', '森林公园南门', '林萃桥', '永泰庄', '西小口', '育新', '霍营', '回龙观东大街', '平西府', '育知路', '朱辛庄'], '8号线南段0': ['珠市口', '天桥', '永定门外', '木樨园', '海户屯', '大红门南', '和义', '东高地', '火箭万源', '五福堂', '德茂', '瀛海'], '9号线0': ['郭公庄', '丰台科技园', '科怡路', '丰台南路', '丰台东大街', '七里庄', '六里桥', '六里桥东', '北京西站', '军事博物馆', '白堆子', '白石桥南', '国家图书馆'], '10号线1': ['巴沟', '苏州街', '海淀黄庄', '知春里', '知春路', '西土城', '牡丹园', '健德门', '北土城', '安贞门', '惠新西街南口', '芍药居', '太阳宫', '三元桥', '亮马桥', '农业展览馆', '团结湖', '呼家楼', '金台夕照', '国贸', '双井', '劲松', '潘家园', '十里河', '分钟寺', '成寿寺', '宋家庄', '石榴庄', '大红门', '角门东', '角门西', '草桥', '纪家庙', '首经贸', '丰台站', '泥洼', '西局', '六里桥', '莲花桥', '公主坟', '西钓鱼台', '慈寿寺', '车道沟', '长春桥', '火器营'], '13号线0': ['西直门', '大钟寺', '知春路', '五道口', '上地', '清河', '西二旗', '龙泽', '回龙观', '霍营', '立水桥', '北苑', '望京西', '芍药居', '光熙门', '柳芳', '东直门'], '14号线东段0': ['善各庄', '来广营', '东湖渠', '望京', '阜通', '望京南', '将台', '东风北桥', '枣营', '朝阳公园', '金台路', '大望路', '九龙山', '平乐园', '北工大西门', '十里河', '方庄', '蒲黄榆', '景泰', '永定门外', '北京南站'], '14号线西段0': ['西局', '七里庄', '大井', '郭庄子', '大瓦窑', '园博园', '张郭庄'], '15号线0': ['俸伯', '顺义', '石门', '南法信', '后沙峪', '花梨坎', '国展', '孙河', '马泉营', '崔各庄', '望京东', '望京', '望京西', '关庄', '大屯路东', '安立路', '奥林匹克公园', '北沙滩', '六道口', '清华东路西口'], '16号线0': ['北安河', '温阳路', '稻香湖路', '屯佃', '永丰', '永丰南', '西北旺', '马连洼', '农大南路', '西苑'], '八通线0': ['四惠', '四惠东', '高碑店', '传媒大学', '双桥', '管庄', '八里桥', '通州北苑', '果园', '九棵树', '梨园', '临河里', '土桥', '花庄'], '昌平线0': ['昌平西山口', '十三陵景区', '昌平', '昌平东关', '北邵洼', '南邵', '沙河高教园', '沙河', '巩华城', '朱辛庄', '生命科学园', '西二旗'], '大兴国际机场线0': ['草桥', '大兴新城', '大兴机场'], '房山线0': ['阎村东', '苏庄', '良乡南关', '良乡大学城西', '良乡大学城', '良乡大学城北', '广阳城', '篱笆房', '长阳', '稻田', '大葆台', '郭公庄'], '首都机场线0': ['T3航站楼', 'T2航站楼', '三元桥', '东直门'], '西郊线0': ['巴沟', '颐和园西门', '茶棚', '万安', '植物园', '香山'], '燕房线0': ['阎村东', '紫草坞', '阎村', '星城', '大石河东', '马各庄', '饶乐府', '房山城关', '燕山'], '亦庄线0': ['宋家庄', '肖村', '小红门', '旧宫', '亦庄桥', '亦庄文化园', '万源街', '荣京东街', '荣昌东街', '同济南路', '经海路', '次渠南', '次渠', '亦庄火车站']}\n"
     ]
    }
   ],
   "source": [
    "def get_lines_stations_info(text):\n",
    "    # 请在这里写上你的代码\n",
    "    pattern = re.compile('(?:rs\\\":\\\"([\\d\\s]+).*?\\\"n\\\":\\\"(.*?)\\\")|(?:ln\\\":\\\"(.*?)\\\".*?lo\\\":\\\"(\\d?)\\\")')\n",
    "    lines_list = pattern.findall(str(text))\n",
    "    print(lines_list)\n",
    "\n",
    "    # 遍历text格式数据，组成地点数据结构\n",
    "    # 所有线路信息的dict：key：线路名称；value：站点名称list\n",
    "    lines_info = {}\n",
    "    \n",
    "    # 所有站点信息的dict：key：站点名称；value：站点坐标(x,y)\n",
    "    stations_info = {}\n",
    "    stations_list = []\n",
    "    \n",
    "    \n",
    "    for i in range(len(lines_list)):\n",
    "        # 你可能需要思考的几个问题，获取「地铁线路名称，站点信息list，站名，坐标(x,y)，数据加入站点的信息dict，将数据加入地铁线路dict」\n",
    "        if lines_list[i][-1] == '':\n",
    "            stations_info[lines_list[i][1]] = tuple(map(int,lines_list[i][0].split(' ')))\n",
    "            stations_list.append(lines_list[i][1])\n",
    "        else:\n",
    "            lines_info[lines_list[i][2] + lines_list[i][3]] = stations_list\n",
    "            stations_list = []\n",
    "    return lines_info, stations_info\n",
    "\n",
    "lines_info, stations_info = get_lines_stations_info(text)\n",
    "print(lines_info)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'金安桥': ['四道桥', '四道桥'],\n",
       " '四道桥': ['桥户营', '桥户营'],\n",
       " '桥户营': ['上岸', '上岸'],\n",
       " '上岸': ['栗园庄', '栗园庄'],\n",
       " '栗园庄': ['小园', '小园'],\n",
       " '小园': ['石厂', '石厂'],\n",
       " '石厂': [],\n",
       " '苹果园': ['古城', '古城'],\n",
       " '古城': ['八角游乐园', '八角游乐园'],\n",
       " '八角游乐园': ['八宝山', '八宝山'],\n",
       " '八宝山': ['玉泉路', '玉泉路'],\n",
       " '玉泉路': ['五棵松', '五棵松'],\n",
       " '五棵松': ['万寿路', '万寿路'],\n",
       " '万寿路': ['公主坟', '公主坟'],\n",
       " '公主坟': ['军事博物馆', '军事博物馆', '西钓鱼台', '西钓鱼台'],\n",
       " '军事博物馆': ['木樨地', '木樨地', '白堆子', '白堆子'],\n",
       " '木樨地': ['南礼士路', '南礼士路'],\n",
       " '南礼士路': ['复兴门', '复兴门'],\n",
       " '复兴门': ['西单', '西单', '阜成门', '阜成门'],\n",
       " '西单': ['天安门西', '天安门西', '灵境胡同', '灵境胡同'],\n",
       " '天安门西': ['天安门东', '天安门东'],\n",
       " '天安门东': ['王府井', '王府井'],\n",
       " '王府井': ['东单', '东单'],\n",
       " '东单': ['建国门', '建国门', '灯市口', '灯市口'],\n",
       " '建国门': ['永安里', '永安里', '北京站', '北京站'],\n",
       " '永安里': ['国贸', '国贸'],\n",
       " '国贸': ['大望路', '大望路', '双井', '双井'],\n",
       " '大望路': ['四惠', '四惠', '九龙山', '九龙山'],\n",
       " '四惠': ['四惠东', '四惠东', '四惠东', '四惠东'],\n",
       " '四惠东': ['高碑店', '高碑店'],\n",
       " '积水潭': ['鼓楼大街', '鼓楼大街'],\n",
       " '鼓楼大街': ['安定门', '安定门', '安德里北街', '安德里北街'],\n",
       " '安定门': ['雍和宫', '雍和宫'],\n",
       " '雍和宫': ['东直门', '东直门', '和平里北街', '和平里北街'],\n",
       " '东直门': ['东四十条', '东四十条'],\n",
       " '东四十条': ['朝阳门', '朝阳门'],\n",
       " '朝阳门': ['建国门', '建国门', '东四', '东四'],\n",
       " '北京站': ['崇文门', '崇文门'],\n",
       " '崇文门': ['前门', '前门', '东单', '东单'],\n",
       " '前门': ['和平门', '和平门'],\n",
       " '和平门': ['宣武门', '宣武门'],\n",
       " '宣武门': ['长椿街', '长椿街', '西单', '西单'],\n",
       " '长椿街': ['复兴门', '复兴门'],\n",
       " '阜成门': ['车公庄', '车公庄'],\n",
       " '车公庄': ['西直门', '西直门', '车公庄西', '车公庄西'],\n",
       " '西直门': ['积水潭', '积水潭', '动物园', '动物园', '大钟寺', '大钟寺'],\n",
       " '天宫院': ['生物医药基地', '生物医药基地'],\n",
       " '生物医药基地': ['义和庄', '义和庄'],\n",
       " '义和庄': ['黄村火车站', '黄村火车站'],\n",
       " '黄村火车站': ['黄村西大街', '黄村西大街'],\n",
       " '黄村西大街': ['清源路', '清源路'],\n",
       " '清源路': ['枣园', '枣园'],\n",
       " '枣园': ['高米店南', '高米店南'],\n",
       " '高米店南': ['高米店北', '高米店北'],\n",
       " '高米店北': ['西红门', '西红门'],\n",
       " '西红门': ['新宫', '新宫'],\n",
       " '新宫': ['公益西桥', '公益西桥'],\n",
       " '公益西桥': ['角门西', '角门西'],\n",
       " '角门西': ['马家堡', '马家堡', '草桥', '草桥'],\n",
       " '马家堡': ['北京南站', '北京南站'],\n",
       " '北京南站': ['陶然亭', '陶然亭'],\n",
       " '陶然亭': ['菜市口', '菜市口'],\n",
       " '菜市口': ['宣武门', '宣武门', '广安门内', '广安门内'],\n",
       " '灵境胡同': ['西四', '西四'],\n",
       " '西四': ['平安里', '平安里'],\n",
       " '平安里': ['新街口', '新街口', '车公庄', '车公庄'],\n",
       " '新街口': ['西直门', '西直门'],\n",
       " '动物园': ['国家图书馆', '国家图书馆'],\n",
       " '国家图书馆': ['魏公村', '魏公村'],\n",
       " '魏公村': ['人民大学', '人民大学'],\n",
       " '人民大学': ['海淀黄庄', '海淀黄庄'],\n",
       " '海淀黄庄': ['中关村', '中关村', '知春里', '知春里'],\n",
       " '中关村': ['北京大学东门', '北京大学东门'],\n",
       " '北京大学东门': ['圆明园', '圆明园'],\n",
       " '圆明园': ['西苑', '西苑'],\n",
       " '西苑': ['北宫门', '北宫门'],\n",
       " '北宫门': ['安河桥北', '安河桥北'],\n",
       " '安河桥北': [],\n",
       " '宋家庄': ['刘家窑', '刘家窑', '石榴庄', '石榴庄', '肖村', '肖村'],\n",
       " '刘家窑': ['蒲黄榆', '蒲黄榆'],\n",
       " '蒲黄榆': ['天坛东门', '天坛东门', '景泰', '景泰'],\n",
       " '天坛东门': ['磁器口', '磁器口'],\n",
       " '磁器口': ['崇文门', '崇文门', '桥湾', '桥湾'],\n",
       " '灯市口': ['东四', '东四'],\n",
       " '东四': ['张自忠路', '张自忠路', '南锣鼓巷', '南锣鼓巷'],\n",
       " '张自忠路': ['北新桥', '北新桥'],\n",
       " '北新桥': ['雍和宫', '雍和宫'],\n",
       " '和平里北街': ['和平西桥', '和平西桥'],\n",
       " '和平西桥': ['惠新西街南口', '惠新西街南口'],\n",
       " '惠新西街南口': ['惠新西街北口', '惠新西街北口', '芍药居', '芍药居'],\n",
       " '惠新西街北口': ['大屯路东', '大屯路东'],\n",
       " '大屯路东': ['北苑路北', '北苑路北', '安立路', '安立路'],\n",
       " '北苑路北': ['立水桥南', '立水桥南'],\n",
       " '立水桥南': ['立水桥', '立水桥'],\n",
       " '立水桥': ['天通苑南', '天通苑南', '北苑', '北苑'],\n",
       " '天通苑南': ['天通苑', '天通苑'],\n",
       " '天通苑': ['天通苑北', '天通苑北'],\n",
       " '天通苑北': [],\n",
       " '潞城': ['东夏园', '东夏园'],\n",
       " '东夏园': ['郝家府', '郝家府'],\n",
       " '郝家府': ['北运河东', '北运河东'],\n",
       " '北运河东': ['北运河西', '北运河西'],\n",
       " '北运河西': ['通州北关', '通州北关'],\n",
       " '通州北关': ['物资学院路', '物资学院路'],\n",
       " '物资学院路': ['草房', '草房'],\n",
       " '草房': ['常营', '常营'],\n",
       " '常营': ['黄渠', '黄渠'],\n",
       " '黄渠': ['褡裢坡', '褡裢坡'],\n",
       " '褡裢坡': ['青年路', '青年路'],\n",
       " '青年路': ['十里堡', '十里堡'],\n",
       " '十里堡': ['金台路', '金台路'],\n",
       " '金台路': ['呼家楼', '呼家楼', '大望路', '大望路'],\n",
       " '呼家楼': ['东大桥', '东大桥', '金台夕照', '金台夕照'],\n",
       " '东大桥': ['朝阳门', '朝阳门'],\n",
       " '南锣鼓巷': ['北海北', '北海北', '什刹海', '什刹海'],\n",
       " '北海北': ['平安里', '平安里'],\n",
       " '车公庄西': ['白石桥南', '白石桥南'],\n",
       " '白石桥南': ['花园桥', '花园桥', '国家图书馆', '国家图书馆'],\n",
       " '花园桥': ['慈寿寺', '慈寿寺'],\n",
       " '慈寿寺': ['海淀五路居', '海淀五路居', '车道沟', '车道沟'],\n",
       " '海淀五路居': ['田村', '田村'],\n",
       " '田村': ['廖公庄', '廖公庄'],\n",
       " '廖公庄': ['西黄村', '西黄村'],\n",
       " '西黄村': ['杨庄', '杨庄'],\n",
       " '杨庄': ['金安桥', '金安桥'],\n",
       " '花庄': ['高楼金', '高楼金'],\n",
       " '高楼金': ['群芳', '群芳'],\n",
       " '群芳': ['万盛东', '万盛东'],\n",
       " '万盛东': ['万盛西', '万盛西'],\n",
       " '万盛西': ['黑庄户', '黑庄户'],\n",
       " '黑庄户': ['郎辛庄', '郎辛庄'],\n",
       " '郎辛庄': ['黄厂', '黄厂'],\n",
       " '黄厂': ['焦化厂', '焦化厂'],\n",
       " '焦化厂': ['双合', '双合'],\n",
       " '双合': ['垡头', '垡头'],\n",
       " '垡头': ['欢乐谷景区', '欢乐谷景区'],\n",
       " '欢乐谷景区': ['南楼梓庄', '南楼梓庄'],\n",
       " '南楼梓庄': ['化工', '化工'],\n",
       " '化工': ['百子湾', '百子湾'],\n",
       " '百子湾': ['大郊亭', '大郊亭'],\n",
       " '大郊亭': ['九龙山', '九龙山'],\n",
       " '九龙山': ['双井', '双井', '平乐园', '平乐园'],\n",
       " '双井': ['广渠门外', '广渠门外', '劲松', '劲松'],\n",
       " '广渠门外': ['广渠门内', '广渠门内'],\n",
       " '广渠门内': ['磁器口', '磁器口'],\n",
       " '桥湾': ['珠市口', '珠市口'],\n",
       " '珠市口': ['虎坊桥', '虎坊桥', '天桥', '天桥'],\n",
       " '虎坊桥': ['菜市口', '菜市口'],\n",
       " '广安门内': ['达官营', '达官营'],\n",
       " '达官营': ['湾子', '湾子'],\n",
       " '湾子': ['北京西站', '北京西站'],\n",
       " '北京西站': ['军事博物馆', '军事博物馆'],\n",
       " '中国美术馆': ['南锣鼓巷', '南锣鼓巷'],\n",
       " '什刹海': ['鼓楼大街', '鼓楼大街'],\n",
       " '安德里北街': ['安华桥', '安华桥'],\n",
       " '安华桥': ['北土城', '北土城'],\n",
       " '北土城': ['奥体中心', '奥体中心', '安贞门', '安贞门'],\n",
       " '奥体中心': ['奥林匹克公园', '奥林匹克公园'],\n",
       " '奥林匹克公园': ['森林公园南门', '森林公园南门', '北沙滩', '北沙滩'],\n",
       " '森林公园南门': ['林萃桥', '林萃桥'],\n",
       " '林萃桥': ['永泰庄', '永泰庄'],\n",
       " '永泰庄': ['西小口', '西小口'],\n",
       " '西小口': ['育新', '育新'],\n",
       " '育新': ['霍营', '霍营'],\n",
       " '霍营': ['回龙观东大街', '回龙观东大街', '立水桥', '立水桥'],\n",
       " '回龙观东大街': ['平西府', '平西府'],\n",
       " '平西府': ['育知路', '育知路'],\n",
       " '育知路': ['朱辛庄', '朱辛庄'],\n",
       " '朱辛庄': ['生命科学园', '生命科学园'],\n",
       " '天桥': ['永定门外', '永定门外'],\n",
       " '永定门外': ['木樨园', '木樨园', '北京南站', '北京南站'],\n",
       " '木樨园': ['海户屯', '海户屯'],\n",
       " '海户屯': ['大红门南', '大红门南'],\n",
       " '大红门南': ['和义', '和义'],\n",
       " '和义': ['东高地', '东高地'],\n",
       " '东高地': ['火箭万源', '火箭万源'],\n",
       " '火箭万源': ['五福堂', '五福堂'],\n",
       " '五福堂': ['德茂', '德茂'],\n",
       " '德茂': ['瀛海', '瀛海'],\n",
       " '瀛海': [],\n",
       " '郭公庄': ['丰台科技园', '丰台科技园'],\n",
       " '丰台科技园': ['科怡路', '科怡路'],\n",
       " '科怡路': ['丰台南路', '丰台南路'],\n",
       " '丰台南路': ['丰台东大街', '丰台东大街'],\n",
       " '丰台东大街': ['七里庄', '七里庄'],\n",
       " '七里庄': ['六里桥', '六里桥', '大井', '大井'],\n",
       " '六里桥': ['六里桥东', '六里桥东', '莲花桥', '莲花桥'],\n",
       " '六里桥东': ['北京西站', '北京西站'],\n",
       " '白堆子': ['白石桥南', '白石桥南'],\n",
       " '巴沟': ['苏州街', '苏州街', '颐和园西门', '颐和园西门'],\n",
       " '苏州街': ['海淀黄庄', '海淀黄庄'],\n",
       " '知春里': ['知春路', '知春路'],\n",
       " '知春路': ['西土城', '西土城', '五道口', '五道口'],\n",
       " '西土城': ['牡丹园', '牡丹园'],\n",
       " '牡丹园': ['健德门', '健德门'],\n",
       " '健德门': ['北土城', '北土城'],\n",
       " '安贞门': ['惠新西街南口', '惠新西街南口'],\n",
       " '芍药居': ['太阳宫', '太阳宫', '光熙门', '光熙门'],\n",
       " '太阳宫': ['三元桥', '三元桥'],\n",
       " '三元桥': ['亮马桥', '亮马桥', '东直门', '东直门'],\n",
       " '亮马桥': ['农业展览馆', '农业展览馆'],\n",
       " '农业展览馆': ['团结湖', '团结湖'],\n",
       " '团结湖': ['呼家楼', '呼家楼'],\n",
       " '金台夕照': ['国贸', '国贸'],\n",
       " '劲松': ['潘家园', '潘家园'],\n",
       " '潘家园': ['十里河', '十里河'],\n",
       " '十里河': ['分钟寺', '分钟寺', '方庄', '方庄'],\n",
       " '分钟寺': ['成寿寺', '成寿寺'],\n",
       " '成寿寺': ['宋家庄', '宋家庄'],\n",
       " '石榴庄': ['大红门', '大红门'],\n",
       " '大红门': ['角门东', '角门东'],\n",
       " '角门东': ['角门西', '角门西'],\n",
       " '草桥': ['纪家庙', '纪家庙', '大兴新城', '大兴新城'],\n",
       " '纪家庙': ['首经贸', '首经贸'],\n",
       " '首经贸': ['丰台站', '丰台站'],\n",
       " '丰台站': ['泥洼', '泥洼'],\n",
       " '泥洼': ['西局', '西局'],\n",
       " '西局': ['六里桥', '六里桥', '七里庄', '七里庄'],\n",
       " '莲花桥': ['公主坟', '公主坟'],\n",
       " '西钓鱼台': ['慈寿寺', '慈寿寺'],\n",
       " '车道沟': ['长春桥', '长春桥'],\n",
       " '长春桥': ['火器营', '火器营'],\n",
       " '火器营': ['巴沟', '巴沟'],\n",
       " '大钟寺': ['知春路', '知春路'],\n",
       " '五道口': ['上地', '上地'],\n",
       " '上地': ['清河', '清河'],\n",
       " '清河': ['西二旗', '西二旗'],\n",
       " '西二旗': ['龙泽', '龙泽'],\n",
       " '龙泽': ['回龙观', '回龙观'],\n",
       " '回龙观': ['霍营', '霍营'],\n",
       " '北苑': ['望京西', '望京西'],\n",
       " '望京西': ['芍药居', '芍药居', '关庄', '关庄'],\n",
       " '光熙门': ['柳芳', '柳芳'],\n",
       " '柳芳': ['东直门', '东直门'],\n",
       " '善各庄': ['来广营', '来广营'],\n",
       " '来广营': ['东湖渠', '东湖渠'],\n",
       " '东湖渠': ['望京', '望京'],\n",
       " '望京': ['阜通', '阜通', '望京西', '望京西'],\n",
       " '阜通': ['望京南', '望京南'],\n",
       " '望京南': ['将台', '将台'],\n",
       " '将台': ['东风北桥', '东风北桥'],\n",
       " '东风北桥': ['枣营', '枣营'],\n",
       " '枣营': ['朝阳公园', '朝阳公园'],\n",
       " '朝阳公园': ['金台路', '金台路'],\n",
       " '平乐园': ['北工大西门', '北工大西门'],\n",
       " '北工大西门': ['十里河', '十里河'],\n",
       " '方庄': ['蒲黄榆', '蒲黄榆'],\n",
       " '景泰': ['永定门外', '永定门外'],\n",
       " '大井': ['郭庄子', '郭庄子'],\n",
       " '郭庄子': ['大瓦窑', '大瓦窑'],\n",
       " '大瓦窑': ['园博园', '园博园'],\n",
       " '园博园': ['张郭庄', '张郭庄'],\n",
       " '张郭庄': [],\n",
       " '俸伯': ['顺义', '顺义'],\n",
       " '顺义': ['石门', '石门'],\n",
       " '石门': ['南法信', '南法信'],\n",
       " '南法信': ['后沙峪', '后沙峪'],\n",
       " '后沙峪': ['花梨坎', '花梨坎'],\n",
       " '花梨坎': ['国展', '国展'],\n",
       " '国展': ['孙河', '孙河'],\n",
       " '孙河': ['马泉营', '马泉营'],\n",
       " '马泉营': ['崔各庄', '崔各庄'],\n",
       " '崔各庄': ['望京东', '望京东'],\n",
       " '望京东': ['望京', '望京'],\n",
       " '关庄': ['大屯路东', '大屯路东'],\n",
       " '安立路': ['奥林匹克公园', '奥林匹克公园'],\n",
       " '北沙滩': ['六道口', '六道口'],\n",
       " '六道口': ['清华东路西口', '清华东路西口'],\n",
       " '清华东路西口': [],\n",
       " '北安河': ['温阳路', '温阳路'],\n",
       " '温阳路': ['稻香湖路', '稻香湖路'],\n",
       " '稻香湖路': ['屯佃', '屯佃'],\n",
       " '屯佃': ['永丰', '永丰'],\n",
       " '永丰': ['永丰南', '永丰南'],\n",
       " '永丰南': ['西北旺', '西北旺'],\n",
       " '西北旺': ['马连洼', '马连洼'],\n",
       " '马连洼': ['农大南路', '农大南路'],\n",
       " '农大南路': ['西苑', '西苑'],\n",
       " '高碑店': ['传媒大学', '传媒大学'],\n",
       " '传媒大学': ['双桥', '双桥'],\n",
       " '双桥': ['管庄', '管庄'],\n",
       " '管庄': ['八里桥', '八里桥'],\n",
       " '八里桥': ['通州北苑', '通州北苑'],\n",
       " '通州北苑': ['果园', '果园'],\n",
       " '果园': ['九棵树', '九棵树'],\n",
       " '九棵树': ['梨园', '梨园'],\n",
       " '梨园': ['临河里', '临河里'],\n",
       " '临河里': ['土桥', '土桥'],\n",
       " '土桥': ['花庄', '花庄'],\n",
       " '昌平西山口': ['十三陵景区', '十三陵景区'],\n",
       " '十三陵景区': ['昌平', '昌平'],\n",
       " '昌平': ['昌平东关', '昌平东关'],\n",
       " '昌平东关': ['北邵洼', '北邵洼'],\n",
       " '北邵洼': ['南邵', '南邵'],\n",
       " '南邵': ['沙河高教园', '沙河高教园'],\n",
       " '沙河高教园': ['沙河', '沙河'],\n",
       " '沙河': ['巩华城', '巩华城'],\n",
       " '巩华城': ['朱辛庄', '朱辛庄'],\n",
       " '生命科学园': ['西二旗', '西二旗'],\n",
       " '大兴新城': ['大兴机场', '大兴机场'],\n",
       " '大兴机场': [],\n",
       " '阎村东': ['苏庄', '苏庄', '紫草坞', '紫草坞'],\n",
       " '苏庄': ['良乡南关', '良乡南关'],\n",
       " '良乡南关': ['良乡大学城西', '良乡大学城西'],\n",
       " '良乡大学城西': ['良乡大学城', '良乡大学城'],\n",
       " '良乡大学城': ['良乡大学城北', '良乡大学城北'],\n",
       " '良乡大学城北': ['广阳城', '广阳城'],\n",
       " '广阳城': ['篱笆房', '篱笆房'],\n",
       " '篱笆房': ['长阳', '长阳'],\n",
       " '长阳': ['稻田', '稻田'],\n",
       " '稻田': ['大葆台', '大葆台'],\n",
       " '大葆台': ['郭公庄', '郭公庄'],\n",
       " 'T3航站楼': ['T2航站楼', 'T2航站楼'],\n",
       " 'T2航站楼': ['三元桥', '三元桥'],\n",
       " '颐和园西门': ['茶棚', '茶棚'],\n",
       " '茶棚': ['万安', '万安'],\n",
       " '万安': ['植物园', '植物园'],\n",
       " '植物园': ['香山', '香山'],\n",
       " '香山': [],\n",
       " '紫草坞': ['阎村', '阎村'],\n",
       " '阎村': ['星城', '星城'],\n",
       " '星城': ['大石河东', '大石河东'],\n",
       " '大石河东': ['马各庄', '马各庄'],\n",
       " '马各庄': ['饶乐府', '饶乐府'],\n",
       " '饶乐府': ['房山城关', '房山城关'],\n",
       " '房山城关': ['燕山', '燕山'],\n",
       " '燕山': [],\n",
       " '肖村': ['小红门', '小红门'],\n",
       " '小红门': ['旧宫', '旧宫'],\n",
       " '旧宫': ['亦庄桥', '亦庄桥'],\n",
       " '亦庄桥': ['亦庄文化园', '亦庄文化园'],\n",
       " '亦庄文化园': ['万源街', '万源街'],\n",
       " '万源街': ['荣京东街', '荣京东街'],\n",
       " '荣京东街': ['荣昌东街', '荣昌东街'],\n",
       " '荣昌东街': ['同济南路', '同济南路'],\n",
       " '同济南路': ['经海路', '经海路'],\n",
       " '经海路': ['次渠南', '次渠南'],\n",
       " '次渠南': ['次渠', '次渠'],\n",
       " '次渠': ['亦庄火车站', '亦庄火车站'],\n",
       " '亦庄火车站': []}"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 根据线路信息，建立站点邻接表dict\n",
    "def get_neighbor_info(lines_info):\n",
    "\n",
    "    # 把str2加入str1站点的邻接表中\n",
    "    def add_neighbor_dict(info, str1, str2):\n",
    "        # 请在这里写代码\n",
    "        if str1 not in info.keys():\n",
    "            info[str1] = []\n",
    "        if str2 not in info.keys():\n",
    "            info[str2] = []\n",
    "        info[str1].append(str2)\n",
    "        info[str1].append(str2)\n",
    "        \n",
    "    neighbor_info={}\n",
    "    for item in lines_info.items():\n",
    "        for i in range(len(item[1])-1):\n",
    "            add_neighbor_dict(neighbor_info,item[1][i],item[1][i+1])\n",
    "        if item[0][-1] == '1':\n",
    "            add_neighbor_dict(neighbor_info, item[1][-1],item[1][0])\n",
    "    return neighbor_info\n",
    "        \n",
    "neighbor_info = get_neighbor_info(lines_info)\n",
    "neighbor_info"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 画地铁图\n",
    "import networkx as nx\n",
    "import matplotlib\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# 如果汉字无法显示，请参照\n",
    "matplotlib.rcParams['font.sans-serif'] = ['SimHei'] \n",
    "\n",
    "# matplotlib.rcParams['font.family']='sans-serif'\n",
    "subwayMap=nx.Graph(neighbor_info)\n",
    "fig=plt.figure()                                 \n",
    "nx.draw_networkx_nodes(subwayMap,pos = stations_info)\n",
    "nx.draw_networkx_edges(subwayMap,pos = stations_info)\n",
    "nx.draw_networkx_labels(subwayMap,pos = stations_info)\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 你可以用递归查找所有路径\n",
    "def get_path_DFS_ALL(lines_info, neighbor_info, from_station, to_station):\n",
    "    # 递归算法，本质上是深度优先\n",
    "    # 遍历所有路径\n",
    "    # 这种情况下，站点间的坐标距离难以转化为可靠的启发函数，所以只用简单的BFS算法\n",
    "    # 检查输入站点名称\n",
    "    res = get_next_station_DFS_ALL([{from_station}, -1, [from_station]], neighbor_info, to_station)\n",
    "    return res[-1]\n",
    "def get_next_station_DFS_ALL(node, neighbor_info, to_station):\n",
    "    res = []\n",
    "    if node\n",
    "    return res\n",
    "\n",
    "res = get_path_DFS_ALL(lines_info, neighbor_info, '大兴机场','航站楼')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#  你也可以使用第二种算法：没有启发函数的简单宽度优先\n",
    "\n",
    "def get_path_BFS(lines_info, neighbor_info, from_station, to_station):\n",
    "    # 搜索策略：以站点数量为cost（因为车票价格是按站算的）\n",
    "    # 这种情况下，站点间的坐标距离难以转化为可靠的启发函数，所以只用简单的BFS算法\n",
    "    # 由于每深一层就是cost加1，所以每层的cost都相同，算和不算没区别，所以省略\n",
    "    # 检查输入站点名称\n",
    "    pass\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 你还可以用第三种算法：以路径路程为cost的启发式搜索\n",
    "\n",
    "import pandas as pd\n",
    "def get_path_Astar(lines_info, neighbor_info, stations_info, from_station, to_station):\n",
    "    # 搜索策略：以路径的站点间直线距离累加为cost，以当前站点到目标的直线距离为启发函数\n",
    "    # 检查输入站点名称\n",
    "    pass"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## （Optional）Create different policies for transfer system."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "以下部门为可选部分，请酌情完成。 并不要求全部同学完成。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As much as you can to use the already implemented search agent. You just need to define the **is_goal()**, **get_successor()**, **strategy()** three functions. \n",
    "\n",
    "> a.\tDefine different policies for transfer system. \n",
    "\n",
    "> b.\tSuch as Shortest Path Priority（路程最短优先）, Minimum Transfer Priority(最少换乘优先), Comprehensive Priority(综合优先)\n",
    "\n",
    "> c.\tImplement Continuous transfer. Based on the Agent you implemented, please add this feature: Besides the @param start and @param destination two stations, add some more stations, we called @param by_way, it means, our path should from the start and end, but also include the  @param by_way stations. \n",
    "\n",
    "e.g \n",
    "```\n",
    "1. Input:  start=A,  destination=B, by_way=[C] \n",
    "    Output: [A, … .., C, …. B]\n",
    "2. Input: start=A, destination=B, by_way=[C, D, E]\n",
    "    Output: [A … C … E … D … B]  \n",
    "    # based on your policy, the E station could be reached firstly. \n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 5.\tTest your result with commercial applications. \n",
    "\n",
    "将你的结果和高德地图或者百度地图进行比较，如果有不同，请分析原因"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "恭喜，完成本次课程，你对常用的人工智能方法以及有一定的了解了。基于规则的，基于概率模型的，基于搜索的，基于机器学习的。 可以说，我们现在通常见到的方法都能够归属到这几类方法中。 这就是**人工智能**，并没有很难是吧？ 继续加油！"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![](https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1562415163815&di=4b29a2a863a8285212033760f288ed7a&imgtype=0&src=http%3A%2F%2F5b0988e595225.cdn.sohucs.com%2Fimages%2F20180710%2F8704194a1d7f46a383ddc29d40c9bca5.jpeg)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
